#include "ts.h"

/**
  * @brief  ts触摸屏初始化(申请ts触摸屏设备资源)
  * @note   gec6818的触摸屏(2024.8.23)
  * @param  dev_pathname: lcd设备文件的路径  
  * @retval 成功：返回ts设备结构体指针
  *         失败：返回NULL
  */
ts_msg_p TS_Init(const char *dev_pathname)
{
    // 1、申请堆内存空间(ts设备结构体)
    ts_msg_p ts_p = malloc(sizeof(ts_msg));
    bzero(ts_p, sizeof(ts_msg));

    // 2、判断是否申请成功，成功给lcd设备结构体赋值
    if(ts_p != NULL)
    {
        // a、打开文件(ts设备文件)(以读的权限打开)
        ts_p->fd = open(dev_pathname, O_RDONLY);
        if(-1 == ts_p->fd)
        {
            printf("PROBLEM: open ts error; REASON: %s; LINE: %d;\n", strerror(errno), __LINE__);
            return NULL;
        }

        // b、触摸屏其它信息初始化
        ts_p->x          = 0;
        ts_p->y          = 0;
        ts_p->touch      = 0;

        ts_p->slide_x1   = 0;       // 滑动初值末值初始化
        ts_p->slide_x2   = 0;
        ts_p->slide_y1   = 0;
        ts_p->slide_y2   = 0;

        ts_p->up_flag    = 0;       // 上下左右滑动标志初始化
        ts_p->down_flag  = 0;
        ts_p->left_flag  = 0;
        ts_p->right_flag = 0;

    }

    // 3、成功返回指向这个ts设备结构体的指针
    return ts_p;
}

/**
  * @brief  释放ts设备资源
  * @note   None
  * @param  ts_p: 指向ts设备结构体的指针
  * @retval None
  */
void TS_UnInit(ts_msg_p ts_p)
{
    close(ts_p->fd);               // 关闭ts设备文件
    free(ts_p);                    // 释放掉ts设备结构体堆内存空间
}


/**
  * @brief  获取触摸屏的值
  * @note   x和y轴的坐标值、按压值、上下左右滑动值
  * @param  ts_p: 指向ts设备结构体的指针
  * @retval None
  */
void TS_GetVal(ts_msg_p ts_p)
{

    while (1)
    {
        // 1、读取触摸屏的值，放入到输入子系统结构体中
        bzero(&ts_p->ts_buf, sizeof(ts_p->ts_buf));                             // 清空
        ts_p->ret =  read(ts_p->fd, &ts_p->ts_buf, sizeof(ts_p->ts_buf));       // read函数是一个阻塞函数(等你摸它) 
       
        // 2、判断是否有完整将触摸屏数据读取出来
        if(ts_p->ret == sizeof(ts_p->ts_buf))
        {

              // A、处理触摸屏事件
            if(ts_p->ts_buf.type == EV_ABS)
            {
                // a、处理触摸屏的x轴的事件代码
                if(ts_p->ts_buf.code == ABS_X)
                {
#if BLACK_TS
                    ts_p->x = ts_p->ts_buf.value*800/1024;
#elif BLUE_TS
                    ts_p->x = ts_p->ts_buf.value;
#endif
                }

                 // b、处理触摸屏的y轴的事件代码
                if(ts_p->ts_buf.code == ABS_Y)
                {
#if BLACK_TS
                    ts_p->y = ts_p->ts_buf.value*480/600;
#elif BLUE_TS
                    ts_p->y = ts_p->ts_buf.value;
#endif
                }     
            } 
            // B、处理触摸屏的(按压/按钮)事件
            if(ts_p->ts_buf.type == EV_KEY && ts_p->ts_buf.code == BTN_TOUCH)
            {   
                ts_p->touch = ts_p->ts_buf.value;

                switch (ts_p->touch)
                {
                    case 0: // 末值
                        ts_p->slide_x2 = ts_p->x;
                        ts_p->slide_y2 = ts_p->y;

                        if( (ts_p->slide_x1 - ts_p->slide_x2) > 50)
                        {
                            ts_p->left_flag = 1;     // 左划标志
                        }
                        
                        if( (ts_p->slide_x1 - ts_p->slide_x2) < -50)
                        {
                            ts_p->right_flag = 1;    // 右划标志
                        }
                        if(ts_p->slide_y1 - ts_p->slide_y2 > 50)
                        {
                            ts_p->down_flag = 1;     // 下划标志
                        }
                        if(ts_p->slide_y1 - ts_p->slide_y2 < -50)
                        {
                            ts_p->up_flag = 1;      // 上划标志
                        }
                        
                        break;

                    case 1: // 初值
                        ts_p->slide_x1 = ts_p->x;
                        ts_p->slide_y1 = ts_p->y;
                        break;                   
                }
                if(ts_p->touch == 0)
                {
                    ts_p->up_flag = 0;
                    ts_p->down_flag = 0;
                    ts_p->left_flag = 0;
                    ts_p->right_flag = 0;
                }
                break;

            }

        }
        
    }
    printf("(%d, %d, %d)\n", ts_p->x, ts_p->y, ts_p->touch);

}